package com.utils;

import java.sql.*;
import java.util.ResourceBundle;

public class DBUtil {

    // 静态变量：在类加载时执行
    // 并且是有顺序的。自上而下的顺序。
    // 属性资源文件绑定
    private static ResourceBundle bundle = ResourceBundle.getBundle("config");
    // 根据key获取value
    private static String driver = bundle.getString("driver");
    private static String url = bundle.getString("url");
    private static String user = bundle.getString("username");
    private static String password = bundle.getString("password");

    static {
        // 注册驱动(注册驱动只需要注册一次，放在静态代码块当中。DBUtil类加载的时候执行。)
        try {
            /*
            "com.mysql.cj.jdbc.Driver"是连接数据库的驱动，不能写死。因为以后可能还会连接Oracle数据库
            如果连接Oracle数据库的时候，还需要修改java代码，显然违背了OCP开闭原则
            OCP开闭原则，对扩展开放，对修改关闭。(什么是符合OCP呢？在进行功能扩展的时候，不需要修改java源代码)
             */
            //Class.forName("com.mysql.cj.jdbc.Driver");

            Class.forName(driver);//注册数据库驱动
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连对象
     * @return conn 连接对象
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        Connection conn = DriverManager.getConnection(url,user,password);
        return conn;
    }

    /**
     * 释放资源
     * @param conn 数据库连接对象
     * @param ps 数据库操作对象
     * @param rs 结果集
     */
    public static void close(Connection conn, Statement ps, ResultSet rs) {//用于关闭数据库连接、语句和结果集对象。
        if (rs != null) { //结果集
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {//存入SQL的语句
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {//数据库连接对象
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
